<?php

/**
 * Segítségével a versenyek között lehet böngészni.
 *
 * Támogatott iniParams értékek:
 * - "langcode" : String
 * 		Melyik nyelven kell?
 * - "label" : String
 * 		A gyökér elem neve. Ha "txtkey:myLabel" formájú, akkor a TextHandler segítségével nyelvesíti
 * 		a cimkét!
 *
 * @author poli
 */
class TournamentBrowserContentManager extends BrowserContentManager {

	/**
	 * A fa gyökér elemének a neve
	 * @var string
	 */
	private $_label;

	/**
	 * A nyelvkód amivel dolgozunk
	 * @var string
	 */
	private $_langcode;

	/**
	 * Ez a fa jelenik meg a content részen, melyen böngészhetők a site-ok és a cikkek
	 *
	 * @var Tree
	 */
	private $_contentTree;

	/**
	 * Ilyen formában adja vissza az eredményt.
	 */
	private $_target;

	/**
	 * A versenyek.
	 * @var array
	 */
	private $_tournaments;

	/**
	 * Készít egy új TournamentBrowserContentManager objektumot
	 *
	 * @param string $id a manager egyedi azonosítója a szülő BrowserConfig-on belül
	 * @param string $parentConfigId a manager szülő BrowserConfig objektumának az id-je -ezzel akár le is kérheti bármikor az objektumot a Browser osztály segítségével!
	 * @param array $iniParams asszociatív tömb az ini paraméterekkel
	 * @return TournamentBrowserContentManager
	 */
	public function TournamentBrowserContentManager($id, $parentConfigId, $parentBrowserId, $iniParams) {
		global $user;

		$browseOnly = false;
		parent::BrowserContentManager($id, $parentConfigId, $parentBrowserId, $browseOnly);

		$label = FunctionLibrary::getArrayValue($iniParams, "label", "null");
		if(substr($label, 0, strlen("txtkey:")) == "txtkey:")
			$label = TextHandler::getText(substr($label, strlen("txtkey:")), $this->getBrowserLanguage());
		$this->_label = $label;

		$this->_langcode = FunctionLibrary::getArrayValue($iniParams, "langcode", $user->language);
		
		$this->buildContentTree();
	}

	/**
	 * Felépíti a content területen látható fát
	 */
	protected function buildContentTree() {
		$this->_contentTree = new Tree("tournaments", null, 0);
		$rootElement = $this->_contentTree->getRoot();
		$this->_contentTree->hideRootElement = true;

		try {
			$this->_tournaments = SiteDBHelper::getTournaments($this->getBrowserLanguage(), false);
		} catch (Exception $e) {
			$this->_tournaments = array();
			$msg = "failed to read tournaments for browser due: ".Log::getExceptionInfo($e);
			Log::error($msg);
			MailHelper::sendAdminMail('failed to read tournaments for browser', $msg);
		}
		$serial = 1;
		foreach ($this->_tournaments as $tournament) {
			$treeElement = new TreeElement($tournament['name'], $tournament['id']);
			$treeElement->setUserAttribute("type", "t");
			$treeElement->setUserAttribute("id", $tournament['id']);

			$rootElement->addChild($treeElement, true);
		}

		// $rootElement->sortChildren();

		$this->putAttributesToTreeElements($rootElement);
	}

	/**
	 * Felépíti a fa objektumot
	 */
	public function buildTree() {
		$this->tree = new Tree($this->_label, $this->_label, null);

		// muszáj az összes elemnek tudnia hogy melyik borwser alatt van!
		$this->putAttributesToTreeElements($this->tree->getRoot());
	}

	/**
	 * Attribokat rámol az elemekbe
	 *
	 * @param DirElement $treeElement
	 */
	private function putAttributesToTreeElements($treeElement) {
		$treeElement->setUserAttribute("brId", $this->getParentBrowserId());

		foreach($treeElement->children as $childElement) {
			$this->putAttributesToTreeElements($childElement);
		}
	}

	/**
	 * A browser objektum úgy látja, hogy ennek a managernek kéne kezelnie ezt a kérést...
	 * Ha számára nem értelmezhető a kérés, akkor simán nem kell csináljon semmit!
	 */
	public function handleRequest() {
		$action = FunctionLibrary::getGetOrPostValueSmart("action", null);
		if(!is_null($action)) {
			$elementId = FunctionLibrary::getGetOrPostValueSmart("treeElementId", null);
			if(!is_null($elementId))
				$element = $this->_contentTree->findTreeElementByIdRecursively($elementId);
			else
				$element = null;

			if(!is_null($element)) {
				if($action == "openTreeElement") {
					$element->open();
				} elseif($action == "closeTreeElement") {
					$element->collapse();
				} elseif($action == "clickTreeElement") {
					// megvan!
					// a browser nem igazi url-t rak be, hanem feloldandó site url-t, amit  majd
					// - cikkek esetében - az article handler realtime old fel
					$url = null;
					$type = $element->getUserAttribute("type");
					if ($type == "t") {
						$id = $element->getUserAttribute("id");
						$url = '/url:tournament:'. SiteHandler::getCurrentSiteId() . ':' . $id . ':' . $this->getBrowserLanguage() . ':full/';
					}

					// na jelöljük a döntést ha okés!
					if (!is_null($url)) {
						$this->getBrowser()->userMadeSelection($url);
					} else {
						// hibát jelzünk
						$this->getBrowser()->addPopupMessage(TextHandler::getText("browser_err_basicselection"));
					}
				}
			}
		}
	}

	protected function absoluteUrl($url) {
		return $url;
	}

	/**
	 * Vissza kell adni a content területre a html cuccost
	 *
	 * @return string
	 */
	public function getContentHtml() {
		$tpl = BaseBrowserBase::loadTemplateFile("managers/tournament.tpl.html");
		TextHandler::insertTextsIntoTemplate($tpl);

		$this->_contentTree->renderTreeToTemplate($tpl, 'treeElement', null, null, null, array('TournamentBrowserContentManager', 'treeElementIsAboutToRenderIntoTemplate'));
		return $tpl->get();
	}

	/**
	 * A user a fában a mi egyik elemünkre klikkelt, így mi lettünk aktívak!
	 * VAGY velünk indul a browser - ezesetben a $treeElementId = null lesz!
	 *
	 * @param string $treeElementId ezen id-jű elemre ment a klikk - vagy null ha rögtön az induláskor mi vagyunk aktívak
	 */
	public function activated($treeElementId) {
		if(is_null($treeElementId)) {
			// ez azt jelenti, hogy velünk indul a browser!
			$treeElementId = $this->tree->getRoot()->id;
			$this->selectElement($treeElementId);
		}

		$this->clicked($treeElementId);
	}

	/**
	 * A user a fában a mi egyik elemünkre klikkelt, de eddig is mi voltunk aktívak!
	 *
	 * @param string $treeElementId ezen id-jű elemre ment a klikk
	 */
	public function clicked($treeElementId) {
		$element = $this->_contentTree->findTreeElementByIdRecursively($treeElementId);
		if(!is_null($element)) {
			$element->open();
		}
	}

	/**
	 * Valaki más lett aktív, mi most nem vagyunk képernyőn
	 *
	 */
	public function unactivated() {

	}


	/**
	 * Callback függvény, melyet a fa renderelésekor hív meg a renderelési metódus minde
	 * egyes elem kirajzolásakor.
	 *
	 * @param HTML_Template_ITX $template
	 * @param TreeElement $treeElement
	 * @param array $templateVars
	 * @return array visszaadja a módosított $templateVars cuccot
	 */
	public static function treeElementIsAboutToRenderIntoTemplate($template, $treeElement, $templateVars) {
		$type = $treeElement->getUserAttribute("type");

		$clickUrl = null;
		if($type == "t") {
			// ez egy node elem
			$templateVars["type"] = "tournament";

			$clickUrl = LinkProvider::getLink("br_treeElementClick", array("browserId"=>$treeElement->getUserAttribute("brId"), "treeElement_id"=>$treeElement->id));
		} else {
			$templateVars["type"] = "";
		}

		if(!is_null($clickUrl)) {
			$templateVars['linkOpenTag'] = "<a href=\"$clickUrl\">";
			$templateVars['linkCloseTag'] = "</a>";
		} else {
			$templateVars['linkOpenTag'] = "";
			$templateVars['linkCloseTag'] = "";
		}

		return $templateVars;
	}

	/**
	 * Vissza kell adni a műveleti területre a html cuccost
	 *
	 * @return string
	 */
	public function getOperationsHtml() {
		return "";
	}

}
?>